All files / models clean-v1-undefined.ts

44% Statements 11/25
25% Branches 1/4
50% Functions 3/6
44% Lines 11/25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85                                                        10x   10x 10x     5x     5x                                                                       5x 5x     5x 5x 5x       10x  
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
/**
 * There seems to have been a bug in the messaging SDK versions <= 4.9.x
 * where the IndexedDB model was using a database name of 'undefined'.
 *
 * In 4.10.x we changed the model implementation, but kept the database
 * name as it should have been. This however introduced an issue where
 * two tokens were pointing to the same underlying PushSubscription.
 *
 * This code will look for the undefined database and delete any of the
 * underlying tokens.
 */
 
import IIDModel from '../models/iid-model';
 
const OLD_DB_NAME = 'undefined';
const OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';
 
function handleDb(db: IDBDatabase) {
  Eif (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {
    // We found a database with the name 'undefined', but our expected object
    // store isn't defined.
    return;
  }
 
  const transaction = db.transaction(OLD_OBJECT_STORE_NAME);
  const objectStore = transaction.objectStore(OLD_OBJECT_STORE_NAME);
 
  const iidModel = new IIDModel();
 
  const openCursorRequest: IDBRequest = objectStore.openCursor();
  openCursorRequest.onerror = event => {
    // NOOP - Nothing we can do.
    console.warn('Unable to cleanup old IDB.', event);
  };
 
  openCursorRequest.onsuccess = () => {
    const cursor = openCursorRequest.result;
    if (cursor) {
      // cursor.value contains the current record being iterated through
      // this is where you'd do something with the result
      const tokenDetails = cursor.value;
 
      iidModel.deleteToken(
        tokenDetails.fcmSenderId,
        tokenDetails.fcmToken,
        tokenDetails.fcmPushSet
      );
 
      cursor.continue();
    } else {
      db.close();
      indexedDB.deleteDatabase(OLD_DB_NAME);
    }
  };
}
 
function cleanV1() {
  const request: IDBOpenDBRequest = indexedDB.open(OLD_DB_NAME);
  request.onerror = function(event) {
    // NOOP - Nothing we can do.
  };
  request.onsuccess = function(event) {
    const db = request.result;
    handleDb(db);
  };
}
 
export { cleanV1 };